package com.alan.base.utils;

import androidx.annotation.NonNull;

import com.alan.base.App;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;


/**
 * @author Alan
 * 时 间：2020-08-13
 * 简 述：<功能简述>
 */
public class ThreadUtils {


    private static final ExecutorService customThreadPool = Executors.newFixedThreadPool(20);

    /**
     * 在子线程工作
     * <p>
     * 线程资源必须通过线程池提供，不允许在应用中自行显式创建线程。
     * 说明：使用线程池的好处是减少在创建和销毁线程上所花的时间以及系统资源的开销，解决资源不足的问题。
     * 如果不使用线程池，有可能造成系统创建大量同类线程而导致消耗完内存或者“过度切换”的问题。
     *
     * @param runnable
     */
    public static void runOnThread(@NonNull Runnable runnable) {
        customThreadPool.execute(runnable);
    }

    public static <T> void run(OnThreadRunnable<T> onThreadRunnable) {
        if (null == onThreadRunnable) {
            return;
        }
        customThreadPool.execute(new Runnable() {
            @Override
            public void run() {
                T t = onThreadRunnable.onThread();
                App.getInstance().getMainHandler().post(new Runnable() {
                    @Override
                    public void run() {
                        onThreadRunnable.onMainThread(t);
                    }
                });
            }
        });
    }

    public void runUIThread(Runnable runnable) {
        App.getInstance().getMainHandler().post(runnable);
    }


    public interface OnThreadRunnable<T> {

        T onThread();

        void onMainThread(T t);
    }

}
